# Date： 2023/2/20 16:05

# 字符串的驻留机制：进保存一份相同且不可变字符串的方法，不同的值被存放在字符串的驻留池中，对相同的字符串只保留一份拷贝，后续创建的相同的字符串时，不会开辟新空间，而是将字符串的地址赋给新创建的变量。

# 字符串的常用操作
    # 查询操作
        # index(): 查询子串 substr 第一次出现的位置，如果查找的子串不存在时候，则抛出 ValueError
        # rindex(): 查询子串 substr 最后一次出现的位置，如果查找的子串不存在时候，则抛出 ValueError
        # find(): 查询子串 substr 第一次出现的位置，如果查找的子串不存在时候，则返回 -1
        # rfind(): 查询子串 substr 最后一次出现的位置，如果查找的子串不存在时候，则返回 -1
s='Hello Python!  Hello World!'
print(s.index('lo'))
print(s.rindex('lo'))
print(s.find('lo'))
print(s.rfind('lo'))


# 字符串大小写转换
    # upper(): 将字符都转成大写
    # lower(): 将字符都转成小写
    # swapcase(): 把字符串中的大写字母转成小写，将小写字母转成大写
    # capitalize(): 将第一个字符串转成大写，其他转成小写
    # title(): 把每一个单词的第一个字符转换成大写，把每个单词的剩余字符转换为小写

# 字符串内容对其操作的方法
    # center(): 居中对齐，第1个参数指定宽度，第二个参数指定填充符，第2个参数是可选的，默认是空格，如果设置宽度小于实际宽度则返回原字符串。
    # ljust(): 左对齐，第1个参数指定宽度，第二个参数指定填充符，第2个参数是可选的，默认是空格，如果设置宽度小于实际宽度则返回原字符串。
    # rjust(): 右对齐，第1个参数指定宽度，第二个参数指定填充符，第2个参数是可选的，默认是空格，如果设置宽度小于实际宽度则返回原字符串。
    # zfill(): 右对齐，左边用0填充，该方法只接收一个参数，用于指定字符串的宽度，如果指定的宽度小于等于字符串的长度，返回字符串本身。


# 判断字符串操作的方法
    # isidentifier(): 判断指定的字符串是不是合法的标识符
    # isspace(): 判断指定的字符串是否全部由空白字符组成（回车、换行、水平制表符）
    # isalpha(): 判断指定的字符串是否全部由字母组成
    # isdecimal(): 判断指定字符串是否全部由十进制数字组成
    # isnumeric(): 判断指定的字符串是否全部由数字组成
    # isalnum(): 判断指定字符串是否全部由字母和数字组成



# 字符串的替换
    # replace(): 第 1 个参数指定被替换的子串，第 2 个参数指定替换子串的字符串，该方法返回替换后得到的字符串，替换前的字符串不发生变化，调用该方法时，可以通过第 3 个参数指定最大替换次数。
s002='Hello Java'
print(s.replace('Python', 'Java'))
s003='Hello Python, Python, Python'
print(s003.replace('Python', 'Java', 2))

# 字符串合并
    # join(): 将列表或元组中的字符串合并成一个字符串。
lst01=['hello', 'java', 'python']
print('|'.join(lst01))
print(' '.join(lst01))


# 字符串的切片操作
# 字符串是不可变类型，不具备增删改等操作；切片操作将产生新的对象
s004="hello"
s04=s004[:3]
print(s04)
s05=s004[2:]
print(s05)


# 格式化字符串
# % 占位符：     %s：字符串；     %i 或 %d：整数；      %f：浮点数
name='张三'
age=20
print('我叫%s，今年%d岁了。' % (name, age))

# {} 作占位符：
print('我叫{0}，今年{1}岁了。'.format(name,age))
print(f'我叫{name}，今年{age}岁了。')



# 字符串的编码转换
str01='天涯共此时'
byteStr01=str01.encode(encoding='GBK');     # 一个中文占两个字节
print(byteStr01)
print(byteStr01.decode(encoding='GBK'))

byteStr02=str01.encode(encoding='utf-8')    # 一个中文占三个字节
print(byteStr02)
print(byteStr02.decode(encoding='UTF-8'))







